// 该文件是网络请求的核心工具模块，主要负责：
// 封装与 AI 大模型 API 的通信
// 处理流式和非流式响应
// 统一管理请求参数和配置
// 计算响应速度和性能指标

// 封装 向SiliconFlow 的API请求，并将请求结果进行处理（流式与非流式）返回到上层组件（messageHandle.ts）
// 为什么直接返回 Response：
// 流式响应需要逐块读取数据
// 上层组件（messageHandle.ts）会使用 response.body.getReader() 来读取流式数据
// 不能在这里直接解析 JSON，否则会破坏流式特性

//网络请求
import { useSettingStore } from "@/stores/settings.ts";

// 使用 SiliconFlow 的 API 服务作为后端接口
const API_BASE_URL = 'https://api.siliconflow.cn/v1'

// 定义消息类型
interface sendMessage {
    role: 'user' | 'assistant';
    content: string;
}

//创造网络请求方法
export const createChatCompletion = async (messages: sendMessage[]) => {
    //导入设置仓库
    const settingStore = useSettingStore()
    //发送给api的参数
    const payload = {
        model: settingStore.settings.model,        // 模型名称
        messages,                                  // 消息数组
        stream: settingStore.settings.stream,      // 是否流式输出
        max_tokens: settingStore.settings.maxTokens, // 最大token数
        temperature: settingStore.settings.temperature, // 随机性
        top_p: settingStore.settings.topP,        // 采样概率
        top_k: settingStore.settings.topK,        // 采样数量
    }
    //配置网络请求选项
    const options = {
        //请求方式
        method: "POST",
        //请求头
        headers: {
            //使用 API 密钥进行身份验证
            Authorization: 'Bearer ' + settingStore.settings.apiKey,
            //告知服务器请求体（Body）的数据格式:JSON
            'Content-Type': 'application/json',
        },
        body: JSON.stringify(payload)
    }
    //发送网络请求并处理响应
    try {
        // 记录开始时间
        const startTime = Date.now()
        //发送 fetch 请求,传入请求配置对象 options，得到响应对象response
        const response = await fetch(API_BASE_URL + '/chat/completions', options)

        //检查是否错误
        if (!response.ok) {
            //抛出异常
            throw new Error("HTTP error! status: " + response.status)
        }
        //判断是否需要流式响应
        if (settingStore.settings.stream) {
            // 流式响应数据格式
            console.log(response)
            return response
        }
        else {
            const data = await response.json()
            // 非流式响应数据格式
            console.log(data)
            //计算speed
            const duration = (Date.now() - startTime) / 1000
            //data.usage.completion_tokens：模型生成的回复所消耗的 token 数量,toFixed：将数字转换为指定小数位数的字符串
            data.speed = (data.usage.completion_tokens / duration).toFixed(2)
            return data
        }
    } catch (error) {
        console.error('Chat API Error:', error)
        throw error//向上层抛出错误
    }

}